package test

import (
	"encoding/json"
	"fmt"
	"regexp"
	"strings"
	"time"
)

// ProcessJSONTime 处理 JSON 中的时间字符串，切除时区和毫秒，转为东八区
func ProcessJSONTime(jsonData *[]byte) error {
	// 匹配 JSON 中的时间字符串（带引号的 ISO 格式）
	timeRegex := regexp.MustCompile(`"(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(\.\d+)?([+-]\d{2}:\d{2}|Z)?"`)

	// 替换所有匹配的时间字符串
	processedData := timeRegex.ReplaceAllFunc(*jsonData, func(match []byte) []byte {
		// 提取时间部分（去除引号）
		timeStr := strings.Trim(string(match), "\"")

		// 切除毫秒和时区
		cleanTime := regexp.MustCompile(`\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}`).FindString(timeStr)
		if cleanTime == "" {
			return match // 无法提取标准时间，保持原样
		}

		// 按东八区解析
		layout := "2006-01-02T15:04:05"
		t, err := time.ParseInLocation(layout, cleanTime, time.FixedZone("CST", 8*3600))
		if err != nil {
			return match // 解析失败，保持原样
		}

		// 格式化为带引号的字符串（东八区时间，无时区标识）
		formatted := fmt.Sprintf(`"%s"`, t.Format(layout))
		return []byte(formatted)
	})

	// 更新原始数据
	*jsonData = processedData
	return nil
}

func main() {
	jsonData := []byte(`{
		"id": 123,
		"name": "test",
		"created_at": "2025-06-27T08:37:58.123+08:00",
		"updated_at": "2025-06-27T12:00:00Z",
		"nested": {
			"timestamp": "2025-06-27T15:30:00.456+02:00"
		},
		"times": ["2025-01-01T00:00:00Z", "2025-02-02T12:30:45.789+05:30"]
	}`)

	// 处理 JSON 中的时间
	err := ProcessJSONTime(&jsonData)
	if err != nil {
		panic(err)
	}

	// 输出处理后的 JSON
	fmt.Println(string(jsonData))

	// 现在可以安全地使用 json.Unmarshal
	var result map[string]interface{}
	json.Unmarshal(jsonData, &result)

	// 验证时间字段已被正确处理
	fmt.Println("\n解析后的时间字段:")
	fmt.Printf("created_at: %v\n", result["created_at"])
	fmt.Printf("updated_at: %v\n", result["updated_at"])
}
